bitkeeper revision 1.1010.1.6 (40dbffabQ7DNCZQhMx5yK0HaV4MMWQ)
authormjw@wray-m-3.hpl.hp.com <mjw@wray-m-3.hpl.hp.com>
Fri, 25 Jun 2004 10:34:19 +0000 (10:34 +0000)
committermjw@wray-m-3.hpl.hp.com <mjw@wray-m-3.hpl.hp.com>
Fri, 25 Jun 2004 10:34:19 +0000 (10:34 +0000)
Handle domain exit virq and destroy blkif, netif.

tools/xenmgr/lib/XendDomain.py
tools/xenmgr/lib/server/SrvConsoleServer.py
tools/xenmgr/lib/server/SrvDomain.py
tools/xenmgr/lib/server/blkif.py
tools/xenmgr/lib/server/controller.py
tools/xenmgr/lib/server/netif.py

index 106af33b61d6fa5331602c027bc85190e6d7a291..5c31079b2e547f485ba691a3637d72ab61bd4bd2 100644 (file)
@@ -42,8 +42,13 @@ class XendDomain:
         if xroot.get_rebooted():
             print 'XendDomain> rebooted: removing all domain info'
             self.rm_all()
+        eserver.subscribe('xend.virq', self.onVirq)
         self.initial_refresh()
 
+    def onVirq(self, event, val):
+        print 'XendDomain> virq', val
+        self.reap()
+
     def rm_all(self):
         """Remove all domain info. Used after reboot.
         """
@@ -136,13 +141,33 @@ class XendDomain:
 
     def _delete_domain(self, id, notify=1):
         if id in self.domain:
-            self.domain[id].died()
             if notify: eserver.inject('xend.domain.died', id)
             del self.domain[id]
         if id in self.domain_db:
             del self.domain_db[id]
             self.db.delete(id)
 
+    def reap(self):
+        print 'reap>'
+        domlist = xc.domain_getinfo()
+        casualties = []
+        for d in domlist:
+            print 'dom', d
+            dead = 0
+            dead = dead or (d['crashed'] or d['shutdown'])
+            dead = dead or (d['dying'] and
+                            not(d['running'] or d['paused'] or d['blocked']))
+            if dead:
+                casualties.append(d)
+        for d in casualties:
+            id = str(d['dom'])
+            print 'died> id=', id, d
+            dominfo = self.domain.get(id)
+            if not dominfo: continue
+            dominfo.died()
+            self.domain_destroy(id, refresh=0)
+        print 'reap<'
+
     def refresh(self):
         """Refresh domain list from Xen.
         """
@@ -169,6 +194,7 @@ class XendDomain:
                 d.update(dominfo)
             else:
                 self._delete_domain(d.id)
+        self.reap()
 
     def refresh_domain(self, id):
         dom = int(id)
@@ -232,7 +258,7 @@ class XendDomain:
         self.refresh()
         return val
     
-    def domain_destroy(self, id):
+    def domain_destroy(self, id, refresh=1):
         """Terminate domain immediately.
         """
         dom = int(id)
@@ -240,7 +266,7 @@ class XendDomain:
             return 0
         eserver.inject('xend.domain.destroy', id)
         val = xc.domain_destroy(dom=dom)
-        self.refresh()
+        if refresh: self.refresh()
         return val       
 
     def domain_migrate(self, id, dst):
index 94b7c8e6c8aaa1962b14abbf2c58bd9a693248d6..f3316fef1c8141f90446323449e3126cb34d41dc 100644 (file)
@@ -415,6 +415,7 @@ class VirqClient:
 
     def virqReceived(self, virq):
         print 'VirqClient.virqReceived>', virq
+        eserver.inject('xend.virq', virq)
 
     def lostChannel(self, channel):
         print 'VirqClient.lostChannel>', channel
index d8287e05ea8b30754f4fb6faa32585a34a9b27ab..44d8f4cf6d5ea91b846e7b8710389a8a73f34058 100644 (file)
@@ -40,14 +40,14 @@ class SrvDomain(SrvDir):
     def op_save(self, op, req):
         fn = FormFn(self.xd.domain_save,
                     [['dom', 'int'],
-                     ['dst', 'str']])
+                     ['file', 'str']])
         val = fn(req.args, {'dom': self.dom.id})
         return val
 
     def op_restore(self, op, req):
         fn = FormFn(self.xd.domain_restore,
                     [['dom', 'int'],
-                     ['src', 'str']])
+                     ['file', 'str']])
         val = fn(req.args, {'dom': self.dom.id})
         return val
         
index 92706316b1890e9da5685db6d235283f68989683..f23a6d7fa48f3f7cb1226a0a10435541fef09aae 100755 (executable)
@@ -1,5 +1,8 @@
 from twisted.internet import defer
 
+from xenmgr import sxp
+from xenmgr import PrettyPrint
+
 import channel
 import controller
 from messages import *
@@ -140,11 +143,12 @@ class BlkDev(controller.Dev):
         return 'w' not in self.mode
 
     def sxpr(self):
-        print 'BlkDev>sxpr>', vars(self)
-        val = ['blkif', ['vdev', self.vdev], ['mode', self.mode] ]
+        val = ['blkdev', ['vdev', self.vdev], ['mode', self.mode] ]
         return val
 
     def destroy(self):
+        print 'BlkDev>destroy>', self.vdev
+        PrettyPrint.prettyprint(self.sxpr())
         self.controller.send_be_vbd_destroy(self.vdev)
         
 class BlkifController(controller.Controller):
@@ -166,9 +170,18 @@ class BlkifController(controller.Controller):
                 self.recv_fe_interface_connect,
             }
         self.attached = 1
+        self.evtchn = None
         self.registerChannel()
         #print 'BlkifController<', 'dom=', self.dom, 'idx=', self.idx
 
+    def sxpr(self):
+        val = ['blkif', ['dom', self.dom]]
+        if self.evtchn:
+            val.append(['evtchn',
+                        self.evtchn['port1'],
+                        self.evtchn['port2']])
+        return val
+
     def lostChannel(self):
         print 'BlkifController>lostChannel>', 'dom=', self.dom
         #self.destroyDevices()
@@ -201,7 +214,9 @@ class BlkifController(controller.Controller):
         return d
 
     def destroy(self):
+        print 'BlkifController>destroy> dom=', self.dom
         self.destroyDevices()
+        self.send_be_destroy()
 
     def destroyDevices(self):
         for dev in self.getDevices():
@@ -229,7 +244,8 @@ class BlkifController(controller.Controller):
         return self.attached
 
     def reattached(self):
-        """All devices have been reattached after the back-end control domain has changed.
+        """All devices have been reattached after the back-end control
+        domain has changed.
         """
         msg = packMsg('blkif_fe_interface_status_changed_t',
                       { 'handle' : 0,
@@ -246,6 +262,8 @@ class BlkifController(controller.Controller):
     def recv_fe_interface_connect(self, msg, req):
         val = unpackMsg('blkif_fe_interface_connect_t', msg)
         self.evtchn = channel.eventChannel(0, self.dom)
+        print 'recv_fe_interface_connect>'
+        PrettyPrint.prettyprint(self.sxpr())
         msg = packMsg('blkif_be_connect_t',
                       { 'domid'        : self.dom,
                         'blkif_handle' : val['handle'],
@@ -272,6 +290,13 @@ class BlkifController(controller.Controller):
                         'blkif_handle' : 0 })
         self.factory.writeRequest(msg)
 
+    def send_be_destroy(self):
+        print '>BlkifController>send_be_destroy>', 'dom=', self.dom
+        msg = packMsg('blkif_be_destroy_t',
+                      { 'domid'        : self.dom,
+                        'blkif_handle' : 0 })
+        self.factory.writeRequest(msg)
+
     def send_be_vbd_create(self, vdev):
         dev = self.devices[vdev]
         msg = packMsg('blkif_be_vbd_create_t',
@@ -293,6 +318,8 @@ class BlkifController(controller.Controller):
         self.factory.writeRequest(msg)
 
     def send_be_vbd_destroy(self, vdev):
+        print '>BlkifController>send_be_vbd_destroy>', 'dom=', self.dom, 'vdev=', vdev
+        PrettyPrint.prettyprint(self.sxpr())
         dev = self.devices[vdev]
         msg = packMsg('blkif_be_vbd_destroy_t',
                       { 'domid'                : self.dom,
index cb543fa57cb901e8bc39b6a8457ed79dbbf80ff4..08afdfd634b6b870a0de2e4dc0e72709fda032ce 100755 (executable)
@@ -132,7 +132,7 @@ class Controller(CtrlMsgRcvr):
 
     def close(self):
         self.deregisterChannel()
-        self.lostChannel(self)
+        self.lostChannel()
 
     def lostChannel(self):
         self.factory.instanceClosed(self)
index d2a6a53860a4a723d209433b54192ac437b50bb1..f999aefcc579ea5a713c6d79e3e0805d0dcf3380 100755 (executable)
@@ -2,6 +2,8 @@ import random
 
 from twisted.internet import defer
 
+from xenmgr import sxp
+from xenmgr import PrettyPrint
 from xenmgr import XendBridge
 
 import channel
@@ -117,9 +119,13 @@ class NetDev(controller.Dev):
     def sxpr(self):
         vif = str(self.vif)
         mac = ':'.join(map(lambda x: "%x" % x, self.mac))
-        val = ['netif', ['vif', vif], ['mac', mac]]
+        val = ['netdev', ['vif', vif], ['mac', mac]]
         if self.bridge:
-            val += ['bridge', self.bridge]
+            val.append(['bridge', self.bridge])
+        if self.evtchn:
+            val.append(['evtchn',
+                        self.evtchn['port1'],
+                        self.evtchn['port2']])
         return val
 
     def bridge_add(self, bridge):
@@ -131,6 +137,8 @@ class NetDev(controller.Dev):
         self.bridge = None
 
     def destroy(self):
+        print 'NetDev>destroy>', 'vif=', self.vif
+        PrettyPrint.prettyprint(self.sxpr())
         self.bridge_rem()
         self.controller.send_be_destroy(self.vif)
         
@@ -155,7 +163,10 @@ class NetifController(controller.Controller):
         self.registerChannel()
         #print 'NetifController<', 'dom=', self.dom, 'idx=', self.idx
 
-
+    def sxpr(self):
+        val = ['netif', ['dom', self.dom]]
+        return val
+    
     def randomMAC(self):
         # VIFs get a random MAC address with a "special" vendor id.
         # 
@@ -194,6 +205,7 @@ class NetifController(controller.Controller):
         return dev
 
     def destroy(self):
+        print 'NetifController>destroy>', 'dom=', self.dom
         self.destroyDevices()
         
     def destroyDevices(self):
@@ -270,7 +282,8 @@ class NetifController(controller.Controller):
         self.factory.writeRequest(msg)
 
     def send_be_destroy(self, vif):
-        print 'send_be_destroy>', 'dom=', self.dom, 'vif=', vif
+        print 'NetifController>send_be_destroy>', 'dom=', self.dom, 'vif=', vif
+        PrettyPrint.prettyprint(self.sxpr())
         dev = self.devices[vif]
         del self.devices[vif]
         msg = packMsg('netif_be_destroy_t',